import wandb
import pandas as pd
import json
from datasets import load_from_disk
import re
import numpy as np
from sklearn.metrics import ConfusionMatrixDisplay, confusion_matrix
import matplotlib.pyplot as plt
from sklearn.decomposition import PCA
from sklearn.manifold import TSNE
from langchain.embeddings import HuggingFaceEmbeddings
import plotly.graph_objs as go
import plotly.express as px
from plotly.offline import iplot
import textwrap
from transformers import AutoModelForCausalLM, AutoTokenizer, AutoConfig, BitsAndBytesConfig
from peft import PeftModel, PeftConfig
import torch
from dotenv import load_dotenv
import os
import warnings
import gc
'NoneType' object has no attribute 'cadam32bit_grad_fp32'
/opt/homebrew/Caskroom/miniforge/base/envs/deep-learning/lib/python3.10/site-packages/bitsandbytes/cextension.py:34: UserWarning: The installed version of bitsandbytes was compiled without GPU support. 8-bit optimizers, 8-bit multiplication, and GPU quantization are unavailable.
Ressourcen:
Ressourcen:
Die Modellarchitekturen des LLaMA 2 und Mistral unterscheiden sich kaum.
Die Verwendung der RMSnorm, Aufbau des Feedforward-layers, GQA (nur bei LLaMA 2 34/70b) sowie rotary positional Encoding, sind exakt gleich.
Mistral nutzt im Gegensatz zum LLaMA 2 allerdings zusätzlich eine Sliding-Window-Attention.
Vergleicht man die Parameter des Mistral 7b und LLaMA 2 7b, so fällt auf, dass activation function, hidden size, sowie Anzahl attention heads exakt gleich sind.
Unterscheiden tun sich die Modelle in der Art der Attention:
und in der Grösse der intermediate size, da diese des Mistral dasjenige der LLaMA 2 7/13b übersteigen.
Nach Bau et al. befinden sich die factual associations hauptsächlich in den MLP layers.
Mistral nutzt eine grössere intermediate size als die LLaMA 2 7/13b. Möglicherweise können dadurch mehrere factual associations abgespeichert werden.
Dies wäre eine Erklärung weshalb das Mistral in den Benchmarks im Paper von Albert Q. Jiang et al. besser performt als die genannten LLaMA 2 modelle.
Betrachten wir die Anzahl MLP parameter so können wir folgendes beobachten:
$$ MLP\_PARAMS_{Mistral\ 7b} = 32*3*4096*14336 = 5637144576 $$$$ MLP\_PARAMS_{LLaMA2\ 7b} = 32*3*4096*11008 = 4328521728 $$$$ MLP\_PARAMS_{LLaMA2\ 13b} = 40*3*5120*13824 = 8493465600 $$Das Mistral 7b besitzt mehr Parameter auf den MLPs als das LLaMA 2 7b.
Somit kann das Mistral möglicherweise mehr Informationen aufnehmen als das LLaMA 2 7b.
Das LLaMA 2 13b besitzt allerdings insgesamt mehr Parameter in den MLPs, weshalb man erwarten könnte, dass dies besser performen muss als das Mistral.
Es könnte sein, dass die MLPs in den early Layers ähnlich wie bei CNNs auf kleinere Strukturen und MLPs in den late Layers auf grössere Konzepte achten.
Dies könnte eine Erklärung dafür sein, dass das Mistral trotz weniger MLP Parameter laut den Autoren besser performt als das LLaMA 13b.
Die bessere performance könnte allerdings auch von den Trainingsdaten abhängen.
Das Mistral hat bezüglich Kontext size durch die Verwendung der Sliding-window-attention definitiv einen Vorteil gegenüber den LLaMA models. Dadurch kann Mistral längere Texte als 4096 Tokens verarbeiten.
Die Grouped-query-attention ist ein Tradeoff zwischen Genauigkeit und Geschwindigkeit des Modells, weshalb sowohl LLaMA (allerdings nur das 34 und 70b Modell) als auch die Mistral diese nutzen.
Beide Modelltypen nutzen statt dem vanilla absolute positional encoding das rotary position embedding. Dies hat den Vorteil, dass die Originalen Token-embeddings nicht durch das Positional-encoding kompromitiert werden.
Statt der Layernorm nutzen beide Modelltypen die RMSnorm, welche Effizienter in der Berechnung ist.
TODO: besser begründen wieso diese Wahl getroffen
Wir haben uns aus folgenden Gründen für die LLaMA 2 13b sowie die Mistral 7b entschieden:
Unser Ziel ist es, ein LLM zu entwickeln, welches den Question Answering Pfad unseres Chatbots Data übernehmen kann. Dazu möchten wir ein existierendes LLM so fine-tunen, dass es gestellte Fragen auf zur Verfügung gestelltem Kontext beantworten kann (Retrieval Augmented Generation). Dabei soll das LLM erkennen, ob die zur Beantwortung der Frage notwendigen Informationen im Kontext vorhanden sind, und wenn nicht, die Beantwortung ablehnen (kein pre-trained knowledge verwenden) und diesen Fakt in der Antwort kommunizieren. Der Kontext besteht dabei aus einer Liste von relevanten Chunks, die durch Retrieval aus unserer Vektordatenbank ausgelesen werden. Die Chunks wurden aus den Spaces Daten des Studiengangs Data Science generiert, und enthalten neben dem Text Metadaten wie das Modulkürzel, die vollständige Bezeichnung, die Anzahl ECTS und die Quelle. Das LLM soll in seinen generierten Antworten die Quelle des Chunks angeben, aus dem Informationen zur Beantwortung der Frage verwendet wurden. Damit können Studenten, die den Bot benutzen, bei Bedarf die Antworten des LLMs überprüfen.
Fine-tuning bezeichnet den Prozess der Anpassung eines bereits vortrainierten Modells (pre-trained model) auf eine spezifische Aufgabe oder Daten, um die Leistungsfähigkeit des Modells für diese Aufgabe zu verbessern. Hierbei wird die generelle Wissensbasis des Modells beibehalten, während es gleichzeitig für die speziellen Anforderungen und Nuancen des neuen Anwendungsbereichs optimiert wird.
Modelle wie Llama 2 und Mistral sind vortrainierte Sprachmodelle, die ein breites Verständnis von Sprache und Wissen bieten. Indem wir solche Modelle als Ausgangspunkt nehmen, können wir von dem bereits erworbenen Wissen und den Fähigkeiten des Modells profitieren. Das spart viel Zeit als auch Ressourcen, die wir im Rahmen von NPR gar nicht hätten. Mittels Fine-tuning passen wir diese Modelle an die unter Ziel genannten Bedürfnisse und Daten des Projekts an. Beide Modelle sind auf der Hugging Face Plattform verfügbar. Die Hugging Face Bibliothek transformers bietet uns eine konsistente Schnittstelle zum Arbeiten mit verschiedenen Sprachmodellen.
Wir haben die folgenden Modelle und Datasets von Hugging Face verwendet:
Beim Fine-tuning müssen verschiedene Faktoren berücksichtigt werden, wie die Modellgrösse im Verhältnis zur verfügbaren GPU-Kapazität. Grössere Modelle benötigen mehr Speicher und Rechenleistung, was die Hardwareanforderungen erhöht und Kosten sowie Zugänglichkeit beeinflusst. Uns steht ein Rechner von Tobias mit einer NVIDIA GeForce RTX 4090 zur Verfügung. Ohne die Anwendung einiger Tricks wäre es uns nicht möglich, die ausgewhählten 7B und 13B Parameter grossen Modelle zu fine-tunen.
Quantization und LoRA (Low-Rank Adaptation) sind Techniken, die helfen, die Effizienz von LLMs zu verbessern, indem sie die Modellgrösse reduzieren oder die Anpassungsfähigkeit erhöhen, ohne signifikante Verluste in der Leistung zu verursachen. Quantization verringert den Speicherbedarf, indem es die Präzision der Gewichte des Modells reduziert. LoRA hingegen ist eine Methode, die die Anzahl der zu trainierenden Parameter reduziert, indem es die Matrizen des Modells in niedrigere Ränge zerlegt.
TODO: weiter ausführen
Quantization ist der Prozess der Diskretisierung kontinuierlicher Verteilungswerte in diskrete Werte. Dies bedeutet, dass die kontinuierlichen Gewichte des Modells auf eine festgelegte Anzahl von Werten reduziert werden, was den Speicherbedarf und die Rechenzeit verringert.

Motivation: Der Hauptantrieb hinter Quantization ist die Optimierung der Leistung pro genutztem Bit im Modell. Durch die Reduzierung der Präzision der Gewichte eines Modells können wir eine höhere Effizienz in Speicher und Berechnungen erreichen, was besonders auf Hardware mit begrenzten Ressourcen wie unserer GPU von Bedeutung ist.
4-bit integer Quantization: In unserem Fall verwenden wir 4-bit integer Quantization, was bedeutet, dass jedes Gewicht in unserem Modell auf eines von (2^4 = 16) möglichen Werten reduziert wird. Dies bietet einen guten Kompromiss zwischen Modellleistung und Speichereffizienz.
Blockweise Quantisierung: Eine weitere Optimierungstechnik ist die blockweise Quantisierung, bei der Eingabetensoren in kleinere Blöcke unterteilt werden, die unabhängig voneinander quantisiert werden. Dies ermöglicht eine parallele Verarbeitung über Kerne hinweg, was zu einer schnelleren Optimierung und einer hochpräzisen Quantisierung führt.
Relevante Hyperparameter: Neben der Anzahl der Bits gibt es weitere Variablen, die die Quantisierung verbessern können:
Die Kernidee hinter LoRA ist, dass die Änderungen, die während des Fine-tunings an den Gewichten eines Modells vorgenommen werden, durch zwei Matrizen niedriger Rangordnung dargestellt werden können. Dies basiert auf der Annahme, dass es eine lineare Abhängigkeit in den Anpassungen gibt, und folglich kann das Fine-tuning effizienter gemacht werden, indem der Rang dieser Anpassungen reduziert wird.

Technisch gesehen funktioniert LoRA, indem es eine Änderungsmatrix $\triangle{W}$ der Dimensionen $d \times k$ berechnet. Diese Änderungsmatrix wird dann zu den ursprünglichen Modellgewichten hinzugefügt, um sie zu aktualisieren. Die Matrix $\triangle{W}$ wird durch die Multiplikation zweier neuer Matrizen $B$ und $A$ berechnet: $\triangle{W} = B \times A$. Die Dimensionen von $A$ und $B$ sind so gewählt, dass die resultierende Matrix die Dimensionen der Modellgewichte hat, also beispielsweise $d \times r$ für $B$ und $r \times k$ für $A$, wobei $r$ der Rang ist.
Die Matrix $A$ wird in der Regel aus einer Gaussschen Verteilung initialisiert, während $B$ mit Nullen initialisiert wird. Während des Fine-tunings werden dann diese Gewichte durch Backpropagation angepasst, wobei nur die relativ wenigen Parameter in den Matrizen $A$ und $B$ und nicht die gesamten Gewichte des Modells aktualisiert werden.
Einer der Hauptvorteile von LoRA ist, dass es die Parameter Effizienz während des Fine-tunings erheblich verbessert. Anstatt alle Gewichte eines grossen Modells zu aktualisieren, was oft Millionen oder gar Milliarden von Parametern umfasst, werden nur die Gewichte in den niedrigrangigen Matrizen $A$ und $B$ angepasst. Dies führt zu einer drastischen Reduzierung der Anzahl der zu trainierenden Parameter und damit zu einem effizienteren und schnelleren Fine-tuning.
Obwohl LoRA standardmässig auf das Attention Module (insbesondere die Projektionen für Query und Value) angewendet wird (Hu et al., 2021), empfiehlt sich eine Anwendung auf alle Linearen Layer in den Transformer Blöcken (Dettmers et al., 2023), um die volle Leistungsfähigkeit zu erreichen. Die genaue Grösse der Adapter oder die Rangordnung der Matrizen $A$ und $B$ spielt dabei eine untergeordnete Rolle; entscheidend ist vielmehr die Fähigkeit, die relevanten Änderungen während des Fine-tunings effizient zu repräsentieren und zu optimieren.
QLoRa kombiniert Quantization und LoRA, und bringt dadurch die beiden Optimierungen zusammen. Im besten Fall bleibt die Performance des Modells sogar gleich wie sie es bei einem vollständigen Fine-tuning wäre (Dettmers et. al., 2023). Insgesamt lässt sich mit QLoRA beispielsweise ein 65B Parameter grosses Modell, welches ursprünglich 780 GB GPU Memory benötigt hätte (ohne Berücksichtigung der Activations während der Backpropagation), auf nur einer grossen Datacenter GPU trainieren. In unserem Fall bedeutet dass, dass wir damit 13B und 7B Modelle wie Llama 2 und Mistral auf der 4090 GPU von Tobias Fine-tunen können.

Wir haben QLoRA mit der Hugging Face transformers Library implementiert. Hier sind die Details unserer Fine-tuning Implementierung:
Wir haben LoRAConfig mit spezifischen Parametern eingerichtet:
r: 12 - Der Rang für unsere Matrizen A und B, eine kritische Grösse, die die Anzahl der Parameter, die während des Fine-tunings angepasst werden, bestimmt.lora_alpha: 10 - Ein Multiplikationsfaktor für LoRA-Gewichte, der die Skalierung der LoRA-Updates steuert.lora_dropout: 0.1 - Dropout-Rate, um Overfitting während des Trainings zu vermeiden.bias: "none" - Wir haben uns entschieden, keinen Bias in LoRA zu verwenden.task_type: "CAUSAL_LM" - Unser Modell ist auf kausale Sprachmodellierung ausgerichtet.Um die Quantisierungseffizienz zu maximieren, haben wir BitsAndBytesConfig eingeführt:
load_in_4bit: True - Aktiviert die 4-Bit Quantisierung beim Laden von Modellen.bnb_4bit_use_double_quant: True - Nutzt doppelte Quantisierung für verbesserte Genauigkeit bei 4-Bit Werten.bnb_4bit_quant_type: "nf4" - Spezifiziert den Normal-Float-4-Bit Quantisierungstyp, den wir verwenden.bnb_4bit_compute_dtype: torch.bfloat16 - Legt den Datentyp für die Berechnungen fest, um einen guten Kompromiss zwischen Leistung und Genauigkeit zu gewährleisten.Unser Training wird durch die TrainingArguments und den SFTTrainer gesteuert:
output_dir, overwrite_output_dir, per_device_*_batch_size, und andere Standardparameter steuern, wo und wie das Training durchgeführt wird.gradient_accumulation_steps und learning_rate sind fein abgestimmt, um die Effektivität unseres Trainings zu maximieren.logging_steps, num_train_epochs, und lr_scheduler_type sind entscheidend für das Monitoring und die Steuerung des Trainingsverlaufs.evaluation_strategy und save_strategy sind auf "steps" gesetzt, was bedeutet, dass wir regelmässig evaluieren und speichern, um den Fortschritt zu überwachen.load_best_model_at_end: True und metric_for_best_model: "loss" stellen sicher, dass wir am Ende das Modell mit der besten Leistung auswählen.Der SFTTrainer wird mit unserem Modell, Tokenizer, Daten und spezifischen peft_config für LoRA eingerichtet. Zusätzlich haben wir eine DataCollatorForCompletionOnlyLM eingerichtet, die speziell auf unser Training abgestimmt ist, falls wir nur auf Vervollständigungen trainieren wollen.
Beim Instruction Tuning für das Question Answering mit dem Retrieval-Augmented Generation (RAG)-Ansatz werden bestimmte Anweisungen genutzt, um die Leistungsfähigkeit des LLMs bei der Beantwortung von Fragen zu verbessern. Dies geschieht durch die gezielte Ausrichtung des Modells auf eine spezifische Aufgabenstruktur, die in unserem Fall wie folgt aussieht:
[INST] Dir wird eine Frage gestellt, zu der du den passendsten Kontext erhältst. Deine Aufgabe ist es, die Frage anhand dieses Kontexts zu beantworten. [/INST]
[FRAGE] {question} [/FRAGE]
[KONTEXT] {context} [/KONTEXT]
ANTWORT:
Ein entscheidender Aspekt dieser Methodik ist die Integration einer spezifisch formatierten Aufgabenstellung, die die Struktur und den Zweck der Aufgabe klar definiert. Die Anweisung [INST] gibt dem Modell einen klaren Rahmen vor, innerhalb dessen es arbeiten soll: Eine Frage beantworten, indem der bereitgestellte Kontext genutzt wird.
Der [KONTEXT]-Abschnitt enthält eine Sammlung von Informationsquellen, die als Grundlage für die Beantwortung der Frage dienen. Dieser Kontext wird in einem strukturierten Format präsentiert, das aus verschiedenen immer gleich bleibenden Quellen im JSON Format besteht, wie zum Beispiel:
[
{
"QUELLE":"Encyclopedia Britannica",
"INHALT":"Nördlich werden die Great Plains durch den Kanadischen Schild, südlich durch die Küstenebene des Golfes von Mexiko begrenzt. Die westliche Grenze bilden die Rocky Mountains. ..."
},
...
]
Durch die Strukturierung des Kontexts in Quellen und Inhalte kann das Modell relevante Informationen effizient identifizieren und nutzen, um eine genaue und fundierte Antwort zu generieren.
Die Herausforderung beim Instruction Tuning liegt darin, das Modell so anzupassen, dass es nicht nur die Fragestellung versteht, sondern auch in der Lage ist, den Kontext effektiv zu durchsuchen und die relevantesten Informationen für die Beantwortung der Frage herauszufiltern. Dies erfordert ein tiefes Verständnis der Inhalte und der Fähigkeit, Querverbindungen zwischen Frage und Kontext herzustellen. Auch muss es in der Lage sein, am Ende zu identifizieren, welche Quelle anzugeben ist, basierend darauf welche Informationen bei der Generierung der Antwort verwendet wurden.
Das Fine-tuning ist in der Stage train_llm implementiert, und nutzt den modifizierten Germanquad Datensatz nach genau diesem Instruction Tuning Schema.
Um die Modelle zu evaluieren, werden wir eine Quantitative und eine Qualitative Analyse durchführen. Die Quantitative Analyse wird uns helfen, die Leistung der Modelle anhand von Metriken zu verstehen und direkt zu vergleichen, während die Qualitative Analyse uns Einblicke in die Stärken und Schwächen der Modelle geben wird, wie sie sich in der Realität verhalten.
Im Rahmen der Quantiativen Analyse werden wir folgendes prüfen:
Der BLEU-Score ist ein Mass zur Bewertung der Qualität von einem Vorhergesagten Text. Er vergleicht den generierten Text mit einem oder mehreren Referenztexten, um festzustellen, wie ähnlich dieser zu den Referenztexten ist. Die Hauptkomponenten des BLEU-Scores sind:
N-Gram-Precision: Precision von N-Grams zwischen der Prediction und den Referenztexten.
Clipping: Begrenzt die Anzahl der Übereinstimmenden N-Grams, um übermässige Wiederholungen zu vermeiden.
Breite der N-Grams: Berücksichtigt verschiedene N-Gram-Längen, normalerweise bis zu 4-Grams.
Brevity Penalty (BP): Strafe für zu kurze Übersetzungen, um übermässig kurze Texte zu vermeiden, die sonst hohe Scores erzielen könnten. Formel: $$ \text{BP} = \begin{cases} 1 & \text{wenn } c > r \\ e^{(1-r/c)} & \text{wenn } c \leq r \end{cases} $$ (c) ist die Länge der Predictions und (r) die effektive Referenzlänge.
Berechnung des BLEU-Scores: Der endgültige Score ist das Produkt aus der Brevity Penalty und dem geometrischen Mittel der N-Gram-Precisions: $$ \text{BLEU} = \text{BP} \cdot \exp\left(\sum_{n=1}^{N} w_n \log p_n\right) $$ ($p_n$) ist die Precision für N-Grams, ($w_n$) das Gewicht für jedes N-Gram $=1/N$, und ($N$) die maximale N-Gram-Länge.
Der Bleu score liegt im Intervall [0, 1] wobei dieser 1 ist, wenn die Prediction und Referenz genau gleich sind.
Der beste Score welcher realistisch erreicht werden kann liegt um die 0.6 - 0.7.
Der Bleu score hat keine Context awareness. Bedeutet, dass er den Inhalt der Texte nicht versteht und daher auch schwerwiegende Fehler machen kann.
Beispielsweise würde er bei "Ich werde übermorgen zusammen mit meiner Freundin ins Kino gehen" und "Ich werde übermorgen nicht zusammen mit meiner Freundin ins Kino gehen" einen hohen score anzeigen,
obwohl die Sätze komplett verschiedene Bedeutungen haben.
Der Bleu score konzentriert sich auf die Präzision. Es misst, wie viele Wörter oder Phrasen im generierten Text mit den Wörtern oder Phrasen in den Referenztexten übereinstimmen. Höhere BLEU-Werte deuten darauf hin, dass der generierte Text den Referenztexten ähnlicher ist.
Der Rouge-Score ist eine Metrik, die in der Zusammenfassung von Texten häufig verwendet wird. Es handelt sich um eine Familie von Massen, die die Qualität einer generierten Zusammenfassung im Vergleich zu einer oder mehreren Referenzzusammenfassungen bewertet. Die verschiedenen Varianten des Rouge-Scores erfassen unterschiedliche Aspekte der Ähnlichkeit zwischen den Zusammenfassungenn:
ROUGE-N: Der ROUGE-N Score berechnet sich als ein Verhältnis der Anzahl der übereinstimmenden N-Gramme zur Gesamtzahl der N-Gramme in der Referenzzusammenfassung. Die Formel für ROUGE-N ist: $$ \text{ROUGE-N} = \frac{\sum_{s \in \{\text{Referenzsätze}\}} \sum_{ngram \in s} \text{Count}_{\text{match}}(ngram)}{\sum_{s \in \{\text{Referenzsätze}\}} \sum_{ngram \in s} \text{Count}(ngram)} $$ Dabei ist ($\text{Count}_{\text{match}}(ngram)$) die Anzahl der N-Gramme, die in der generierten Zusammenfassung und der Referenzzusammenfassung übereinstimmen.
ROUGE-L: ROUGE-L verwendet die längste gemeinsame Teilsequenz (LCS). Die Formel für ROUGE-L ist:
$$ \text{LCS}(A, B) = \begin{cases} 0, & \text{wenn } A \text{ oder } B \text{ leer ist} \\ 1 + \text{LCS}(\text{Rest von } A, \text{Rest von } B), & \text{wenn das erste Element von } A \text{ und } B \text{ gleich ist} \\ \max(\text{LCS}(A, \text{Rest von } B), \text{LCS}(\text{Rest von } A, B)), & \text{anderenfalls} \end{cases} $$$$ \text{ROUGE-L} = \frac{\sum_{s \in \{\text{Referenzsätze}\}} \text{LCS}(s, \text{Generierte Zusammenfassung})}{\sum_{s \in \{\text{Referenzsätze}\}} \text{Länge}(s)} $$Hierbei ist ($\text{LCS}(s, \text{Generierte Zusammenfassung})$) die Länge der längsten gemeinsamen Teilsequenz zwischen einem Satz ($s$) der Referenzzusammenfassung und der generierten Zusammenfassung.
ROUGE-W: ROUGE-W berücksichtigt die Gewichtung der Länge der gemeinsamen Teilsequenzen. Die Formel sieht wie folgt aus: $$ \text{ROUGE-W} = \frac{\sum_{s \in \{\text{Referenzsätze}\}} \text{WLCS}(s, \text{Generierte Zusammenfassung})}{\sum_{s \in \{\text{Referenzsätze}\}} \text{Länge}(s)} $$ ($\text{WLCS}$) ist die gewichtete längste gemeinsame Teilsequenz, die längeren Teilsequenzen mehr Gewicht gibt.
Der Rouge score liegt im Intervall [0, 1]. Dieser fokussiert sich auf die Recall-Rate, also die Wiederfindungsrate. Es bewertet, wie viel vom Inhalt der Referenzzusammenfassung in der generierten Zusammenfassung enthalten ist. Höhere ROUGE-Werte zeigen an, dass die generierte Zusammenfassung mehr vom Inhalt der Referenzzusammenfassungen abdeckt.
TODO überprüfen ob formeln/aussagen stimmen
In der Qualitativen Analyse stellen wir zwei unterschiedliche Kontexte mit jeweils 3 Context Blocks (Document Chunk mit Metadaten) zusammen und stellen dem Modell Fragen, die sich auf die einzelnen Context Blocks beziehen können oder auch nicht. Wir werden die Antworten des Modells mit den erwarteten Antworten vergleichen und auf ihre Korrektheit und Verständlichkeit prüfen. Die Qualitative Analyse wird uns helfen, die Stärken und Schwächen der Modelle zu verstehen und zu vergleichen.
Ein Kontext Block besteht aus thematisch ähnlichen Chunks, während der andere Kontext Block thematisch unterschiedliche Chunks enthält.
Dabei prüfen wir folgende Kriterien:
Analyse
ft_data = pd.DataFrame(load_from_disk("data/processed/ft_dataset_abstractive.hf/", keep_in_memory=True))
ft_data.head()
| context | question | extractive_answer | can_be_answered | split | sourced_context | abstractive_answer | |
|---|---|---|---|---|---|---|---|
| 0 | Elisabeth ist Schirmherrin von über 600 wohltä... | Ab wann wurde die Bezeichnung Kubisten benutzt? | Leider liegen mir dazu keine Informationen vor | False | train | [{"QUELLE": "Buckingham Palace", "INHALT": "El... | Leider kann ich Ihnen keine genaue Antwort auf... |
| 1 | Das Königreich Tibet entstand Anfang des 7. Ja... | Wann wurde das Königreich Tibet gegründet? | Anfang des 7. Jahrhunderts | True | train | [{"QUELLE": "und 9. Jahrhundert erreichte das ... | Das Königreich Tibet wurde Anfang des 7. Jahrh... |
| 2 | Der Black Heritage Trail verbindet auf einer L... | Wo beginnt der Black Heritage Trail in Boston? | an der Faneuil Hall | True | train | [{"QUELLE": "The Black Heritage Trail: A Guide... | Der Black Heritage Trail in Boston beginnt an ... |
| 3 | In North Carolina wurden eine Reihe bedeutende... | Welche bedeutende Künstler wurden in North Car... | Sowohl die Schauspielerin Ava Gardner (1922–19... | True | train | [{"QUELLE": "Wikipedia", "INHALT": "In North C... | In North Carolina wurden bedeutende Künstler w... |
| 4 | Neben der Hauptstadt Juneau sind Anchorage, di... | Welches ist die bevölkerungsreichste Stadt in ... | Anchorage | True | train | [{"QUELLE": "Wikipedia", "INHALT": "Neben der ... | Die bevölkerungsreichste Stadt in Alaska ist A... |
fig = px.box(ft_data, x=ft_data["abstractive_answer"].apply(lambda x: len(x.split())))
fig.update_layout(
title_text='Distribution of abstractive answer length',
xaxis_title_text='Length',
yaxis_title_text='Count',
bargap=0.2,
)
fig.show()
# another boxplot, separating by can_be_answered
fig = px.box(ft_data, x=ft_data["abstractive_answer"].apply(lambda x: len(x.split())), color=ft_data["can_be_answered"])
fig.update_layout(
title_text='Distribution of abstractive answer length',
xaxis_title_text='Length',
yaxis_title_text='Count',
bargap=0.2,
)
fig.show()
Die meisten Antworten sind zwischen 14 und 27 Worte lang, wobei die Antworten im Schnitt kürzer ausfallen, wenn can_be_answered False ist. Das ist zu erwarten, da die meisten Antworten in diesem Fall nur aus einem Satz bestehen, der die Frage verneint.
Auffallend ist, dass es trotzdem einige Antworten mit can_be_answered=False und einer Länge von über 80 Wörtern gibt. Wir sind dem nachgegangen, und haben festgestellt, dass es sich dabei um Fälle handelt, wo GPT-3.5 die Aufgabe nicht verstanden hat (unsere Prompt war nicht optimal), und fälschlicherweise eine Antwort mit pre-trained Knowledge generiert hat. Das ist ein Problem für unser Fine-tuning, da dem Modell so nicht ganz klar wird, ob es antworten darf wenn Kontext fehlt. Leider haben wir erst nach dem Fine-tuning gemerkt, dass diese Fälle existieren, und konnten sie nicht mehr aus dem Datenset entfernen. Diese Korrektur wäre eine low-hanging fruit für zukünftige Arbeiten.
# filter for can_be_answered=False where longer than 200 words, and print
df_filtered = ft_data[(ft_data["can_be_answered"] == False) & (ft_data["abstractive_answer"].apply(lambda x: len(x.split())) > 100)]
# loop and print question, extractive answer, abstractive answer
for i, row in df_filtered.iterrows():
print(row["question"])
print(row["extractive_answer"])
print(row["abstractive_answer"])
print("")
Warum können Tauschbörsen für Filme nicht richtig verboten werden? Leider liegen mir dazu keine Informationen vor Es gibt verschiedene Gründe, warum Tauschbörsen für Filme nicht richtig verboten werden können. Ein Grund ist, dass es schwierig ist, die Betreiber solcher Tauschbörsen zu identifizieren und rechtlich zu verfolgen. Oftmals operieren sie anonym im Internet und nutzen Technologien wie VPNs, um ihre Identität zu verschleiern. Zudem können Tauschbörsen leicht ihre Serverstandorte ändern, um den Behörden auszuweichen. Ein weiterer Grund ist, dass es schwierig ist, die Nutzer solcher Tauschbörsen zu ermitteln und zu bestrafen. Oftmals handelt es sich um eine große Anzahl von Personen, die Filme illegal herunterladen oder hochladen, und es ist ressourcenintensiv, gegen jeden einzelnen vorzugehen. Darüber hinaus gibt es auch technische Möglichkeiten, um die Überwachung und Verfolgung von Tauschbörsen zu erschweren, wie beispielsweise die Verwendung von verschlüsselten Verbindungen. Insgesamt ist es eine komplexe und herausfordernde Aufgabe, Tauschbörsen für Filme effektiv zu verbieten. Welchen Einfluss hat Architektur auf Menschen? Leider liegen mir dazu keine Informationen vor Die Architektur eines Gebäudes kann einen erheblichen Einfluss auf Menschen haben. Sie kann das Wohlbefinden, die Produktivität und die Stimmung der Menschen beeinflussen. Eine gut gestaltete Architektur kann eine positive Umgebung schaffen, die das Wohlbefinden fördert und die Interaktion und Kommunikation zwischen den Menschen erleichtert. Eine schlecht gestaltete Architektur kann hingegen zu Unbehagen, Stress und sogar gesundheitlichen Problemen führen. Es gibt viele Aspekte der Architektur, die den Einfluss auf Menschen bestimmen, wie zum Beispiel die Raumgestaltung, die Nutzung von Licht und Farben, die Akustik und die Zugänglichkeit. Es ist wichtig, dass Architekten diese Faktoren bei der Gestaltung von Gebäuden berücksichtigen, um eine positive Umgebung für die Menschen zu schaffen. Warum gibt es auf den estnischen Inseln fast keine russischsprachige Bevölkerung? Leider liegen mir dazu keine Informationen vor Es gibt verschiedene Gründe, warum es auf den estnischen Inseln möglicherweise nur eine geringe russischsprachige Bevölkerung gibt. Ein möglicher Grund könnte die historische Entwicklung sein, da Estland während der sowjetischen Besatzungszeit von 1940 bis 1991 stark russifiziert wurde. Dies führte zu einer Abwanderung vieler Esten und einer verstärkten Zuwanderung von Russen in das Land. Es ist möglich, dass die estnischen Inseln aufgrund ihrer geografischen Lage und begrenzten Ressourcen weniger attraktiv für russischsprachige Einwanderer waren. Es könnte auch kulturelle und sprachliche Unterschiede geben, die dazu beitragen, dass sich die russischsprachige Bevölkerung eher in anderen Teilen Estlands konzentriert. Es ist jedoch wichtig zu beachten, dass dies nur spekulative Gründe sind und weitere Forschung erforderlich wäre, um eine genaue Antwort auf diese Frage zu geben. Warum kam es in der Schweiz nie zu einem eigenständigen Musikstil? Leider liegen mir dazu keine Informationen vor Es gibt verschiedene Gründe, warum es in der Schweiz nie zu einem eigenständigen Musikstil gekommen ist. Einerseits ist die Schweiz ein kleines Land mit einer vielfältigen kulturellen Landschaft, in der verschiedene musikalische Traditionen und Einflüsse aus anderen Ländern existieren. Andererseits hat die Schweiz eine lange Tradition der kulturellen Vielfalt und des kulturellen Austauschs, was dazu führt, dass sich verschiedene Musikstile aus anderen Ländern etabliert haben. Zudem ist die Schweiz geografisch und sprachlich vielfältig, was dazu führt, dass sich verschiedene regionale Musikstile entwickelt haben. Insgesamt kann man sagen, dass die Schweiz eher von einer Vielfalt an Musikstilen geprägt ist, anstatt von einem einheitlichen eigenständigen Stil. Warum haben sich Pflanzen in die hochalpinen Gebiete zurück gezogen? Leider liegen mir dazu keine Informationen vor Es gibt verschiedene Gründe, warum sich Pflanzen in hochalpine Gebiete zurückziehen könnten. Dazu gehören unter anderem die klimatischen Bedingungen, wie niedrige Temperaturen, starke Winde und kurze Vegetationsperioden. Diese Bedingungen können für viele Pflanzenarten extrem herausfordernd sein. Pflanzen, die in der Lage sind, sich an diese extremen Bedingungen anzupassen, können in den hochalpinen Gebieten überleben. Ein weiterer Grund könnte sein, dass die Konkurrenz durch andere Pflanzenarten in tieferen Lagen geringer ist, was den Pflanzen in den hochalpinen Gebieten einen Vorteil verschafft. Es ist jedoch wichtig anzumerken, dass dies nur allgemeine Gründe sind und es von Pflanzenart zu Pflanzenart unterschiedliche spezifische Gründe geben kann. Warum wurde die AdCSV zum standardverfahren? Leider liegen mir dazu keine Informationen vor Die AdCSV wurde zum Standardverfahren, um die Daten auf der CD mit einer passenden Kanalkodierung zu kodieren. Diese Kodierung, auch bekannt als Eight-to-Fourteen-Modulation (EFM), berücksichtigt die Eigenheiten des Speichermediums, wie die optische Abtastung und die Form und Größe der Pits. Die EFM sorgt dafür, dass sich alle drei bis elf Bitdauern die Polarität des ausgelesenen Signals ändert, um eine zuverlässige Datenübertragung zu gewährleisten. Durch diese Modulation kann eine hohe Datenrate erreicht werden, und unmodulierte Daten können nicht mehr in Pits und Land aufgelöst werden. Die AdCSV ist also eine Designentscheidung, die für die Spieldauer und die Vereinfachung der Signalverarbeitung verantwortlich ist. Welcher Zusammenhang steht zwischen Kultur und den Menschenrechten? Leider liegen mir dazu keine Informationen vor Es gibt einen engen Zusammenhang zwischen Kultur und den Menschenrechten. Die Kultur eines Landes kann die Werte, Normen und Überzeugungen beeinflussen, die die Grundlage für die Achtung der Menschenrechte bilden. Eine Kultur, die die Gleichheit, Freiheit und Würde aller Menschen respektiert, fördert in der Regel auch die Einhaltung der Menschenrechte. Auf der anderen Seite können kulturelle Praktiken und Traditionen, die Diskriminierung, Unterdrückung oder Gewalt gegen bestimmte Gruppen fördern, die Menschenrechte verletzen. Es ist wichtig, dass Regierungen und die internationale Gemeinschaft Maßnahmen ergreifen, um sicherzustellen, dass kulturelle Praktiken im Einklang mit den Menschenrechten stehen und dass alle Menschen gleichberechtigt und frei von Diskriminierung behandelt werden. Warum sollte man keine Insekten aufgrund ästhetischer Vorlieben sammeln? Leider liegen mir dazu keine Informationen vor Es gibt verschiedene Gründe, warum man keine Insekten aufgrund ästhetischer Vorlieben sammeln sollte. Ein Grund ist, dass das Sammeln von Insekten zu ihrem Rückgang in der Natur beitragen kann. Viele Insektenarten sind bereits bedroht oder gefährdet, und das Sammeln von ihnen kann ihre Populationen weiter dezimieren. Darüber hinaus spielen Insekten eine wichtige Rolle in Ökosystemen, indem sie als Bestäuber, Schädlingsbekämpfer und Nahrungsquelle für andere Tiere dienen. Das Sammeln von Insekten kann auch ethische Bedenken aufwerfen, da es ihr Leben und ihre Freiheit beeinträchtigt. Es ist daher ratsam, Insekten in ihrer natürlichen Umgebung zu belassen und ihre Schönheit und Vielfalt dort zu bewundern.
references = pd.DataFrame(load_from_disk("data/processed/ft_dataset_abstractive.hf/", keep_in_memory=True).filter(lambda x: x['split'] == "test")) # get test split
Filter: 0%| | 0/4700 [00:00<?, ? examples/s]
def tsne_reduction_interactive(series: pd.Series, title: str, classes=None, pca_dim=50, perplexity=30, learning_rate=200, seed=1234):
# Embeddings erstellen
embeddings = np.array(HuggingFaceEmbeddings(model_name="sentence-transformers/distiluse-base-multilingual-cased-v1").embed_documents(series.to_list()))
wrapped_text = series.apply(lambda x: '<br>'.join(textwrap.wrap(x, width=50)))
# Dimensionsreduktion mittels PCA
pca = PCA(n_components=pca_dim, random_state=seed)
pca_result = pca.fit_transform(embeddings)
# Anwendung von t-SNE
tsne = TSNE(perplexity=perplexity, learning_rate=learning_rate, n_iter=300, random_state=seed)
tsne_result = tsne.fit_transform(pca_result)
# Farbkarte und einzigartige Klassen erstellen
if classes is not None:
unique_classes = list(set(classes))
colors = px.colors.qualitative.Plotly
color_map = {k: colors[i % len(colors)] for i, k in enumerate(unique_classes)}
else:
unique_classes = [None]
color_map = {None: 'blue'}
# Erstellen der Plotly-Figur
fig = go.Figure()
for cls in unique_classes:
if cls is None:
idx = list(range(len(series)))
else:
idx = [i for i, c in enumerate(classes) if c == cls]
fig.add_trace(go.Scatter(
x=tsne_result[idx, 0],
y=tsne_result[idx, 1],
mode='markers',
marker=dict(
size=5,
color=color_map[cls],
opacity=0.8),
name=str(cls) if cls is not None else "Unklassifiziert",
text=[wrapped_text[i] for i in idx]
))
# Layout anpassen
fig.update_layout(
title=title,
xaxis_title='Dimension 1',
yaxis_title='Dimension 2',
width=1000, height=1000,
margin=dict(l=40, r=40, t=40, b=40),
legend_title='Klassen'
)
# Visualisierung anzeigen
iplot(fig)
tsne_reduction_interactive(references.sourced_context, 'PCA and t-SNE reduced embeddings of sourced context of test data', ["answerable" if e else "not answerable" for e in references.can_be_answered.values])
Wie auf dem PCA und t-SNE Plot schön zu sehen ist, sind die Beispiele im Datensatz wo Fragen beantwortet werden können und wo nicht, thematisch sehr unterschiedlich (repräsentiert durch die Verteilung). Damit ist sichergestellt, dass das Modell nicht eifach auswendig lernt, auf bestimmte Themenbereiche keine Antwort zu geben. Dass Beispiele mit ähnlichen Themen näher beeinander liegen, zeigt sich zum Beispiel gut einer Gruppe von Samples in der unteren linken Ecke, wo sich jeweils mindestens ein Kontext auf das Thema Afrika bezieht.
def pred_no_info(series: pd.Series):
return series.str.contains("keine Informationen")
def pred_context(series: pd.Series):
return series.str.contains("\(.+\)$", regex=True)
# Hilfsfunktion, um die Quelle aus dem Kontext zu extrahieren
def extract_source_from_context(context: dict, extractive_answer: str):
# Suche nach dem Element in context, das extractive_answer enthält
for item in context:
if extractive_answer in item["INHALT"]:
return item["QUELLE"]
return ""
# Hilfsfunktion, um die Quelle aus der Vorhersage zu extrahieren
def extract_source_from_prediction(prediction: str) -> str:
match = re.search("\((.+)\)$", prediction)
if match:
source = match.group(1)
# Entferne "Quelle:" (ignoriere Großschreibung)
source = re.sub("quelle:", "", source, flags=re.IGNORECASE).strip()
return source
return ""
# Die zu implementierende Funktion
def pred_context_correct(context: pd.Series, prediction: pd.Series, extractive_answer: pd.Series):
context_predicted = pred_context(prediction).values # get bools where context was predicted
result = []
for i in range(len(context)):
if context_predicted[i]:
# Extrahiere die Quellen aus context und prediction
correct_source = extract_source_from_context(json.loads(context[i]), extractive_answer[i])
predicted_source = extract_source_from_prediction(prediction[i])
# Überprüfe, ob die Quellen übereinstimmen
result.append(correct_source == predicted_source)
else:
result.append(False)
return result
predictions = {}
run_mapper = {"lsmk5mwh": "Mistral", "lw6pvkos": "GermanLLaMA", "2zo8d7kj": "Baseline"}
references = pd.DataFrame(load_from_disk("data/processed/ft_dataset_abstractive.hf/", keep_in_memory=True).filter(lambda x: x['split'] == "test")) #get test split
for run in wandb.Api().runs("t_buess/chatbot-qa"):
for artifact in run.logged_artifacts():
if run.id in list(run_mapper.keys()) and artifact.type == "run_table":
with open(artifact.download() + r"\test\predictions.table.json", "r") as f:
table = json.load(f)
table = pd.concat((references, pd.DataFrame(data=table["data"], columns=table["columns"])[["predictions"]]), axis=1)
#add column where no info predicted
table["pred_no_info"] = pred_no_info(table["predictions"])
table["pred_context"] = pred_context(table["predictions"])
table["pred_source_matches_context"] = pred_context_correct(table["sourced_context"], table["predictions"], table["extractive_answer"])
predictions[run_mapper[run.id]] = table
Filter: 100%|██████████| 4700/4700 [00:00<00:00, 120513.45 examples/s] wandb: 1 of 1 files downloaded. wandb: 1 of 1 files downloaded. wandb: 1 of 1 files downloaded.
fig, ax = plt.subplots(1, len(predictions), figsize=[30,10])
for i, (name, df) in enumerate(predictions.items()):
ConfusionMatrixDisplay(confusion_matrix(df.can_be_answered.values, ~df.pred_no_info.values), display_labels=["answerable", "not answerable"]).plot(ax=ax[i], colorbar=False, text_kw={"size":16})
ax[i].set_title(name)
acc = (df.can_be_answered.values == ~df.pred_no_info.values).sum() / len(df.can_be_answered.values)
ax[i].text(-0.5, 1.6, f"acc: {acc}", size=12)
plt.suptitle("Confusion Matrix: Kann das Modell korrekt erkennen, ob eine Frage mit gegebenem Kontext beantwortet werden kann oder nicht?", size=24)
plt.tight_layout()
plt.show()
Im obigen Plot sind drei Confusion Matrizen dargestellt.
Jede Matrix repräsentiert eines der drei ausgewählten Modelle.
In den Testdaten sind 100 examples vorhanden, bei welchen die Frage aufgrund des mitgegebenen Kontextes beantwortet werden kann.
Zusätzlich sind auch 100 examples vorhanden, bei welchen die Frage nicht beantwortet werden kann.
Die Modelle wurden so trainiert, dass erkannt wird, ob eine Frage beantwortet werden kann.
Sollte eine Frage nicht beantwortet werden können, so sieht die Antwort so oder ähnlich aus:
Solche Antworten enthalten meist den Substring keine Informationen, weshalb beim Auftreten von diesem angenommen wird, dass es sich dabei um eine Frage handelt, welche nicht beantwortet werden kann.
Fälschlicherweise waren in unserem Fine-tuning Datensatz einige Beispiele vorhanden, wo Antwort auf Fragen gegeben wurde, die mit dem gegebenen Kontext nicht beantwortbar gewesen wären. Es ist gut möglich, dass das mit ein Grund dafür ist, dass die Modelle bei der Erkennung von nicht beantwortbaren Fragen immer mal wieder Fehler machen.
Baseline
Das Baseline Model erreicht eine Accuracy von 0.91.
Dieses predicted nur zwei mal, dass eine Frage beantwortet werden kann, obwohl dies nicht der Fall ist.
Allerdings verweigert es 16 mal die Beantwortung, obwohl die Frage beantwortet werden könnte.
GermanLLaMA
Das bereits auf deutschen Daten vortrainierte Model erreicht nur eine Accuracy von 0.885.
Somit performt es schlechter als das Baseline Model.
Bezüglich True label not answerable macht es gleich viele Fehler wie die Baseline.
Allerdings liegt es öfters falsch bei der Vorhersage von answerable.
Man könnte erwarten, dass das GermanLLaMA besser performen sollte als die Baseline.
Weshalb dies nicht der Fall ist, müsste weiter untersucht werden.
Mistral
Das Mistral performte mit einer Accuracy von 0.925 am besten von den drei Modellen.
Es identifizierte alle not answerable korrekt als solche.
Bei 15 Fragen verweigert es allerdings die Antwort, obwohl diese beantwortbar wären.
Nachfolgend wird untersucht, wie die Modelle in der korrekten Ausweisung der Quellen performen.
Dazu wurde bei jedem Modell lediglich die examples angeschaut, bei welchen tatsächlich eine Quelle angegeben wurde.
Anschliessend wurde die korrekte Quelle mit der vorhergesagen Quelle verglichen.
Die korrekte Quelle wurde durch den sourced_context und extractive_answer ermittelt.
Durch diese Methode kann die evaluation relativ einfach mittels Regex durchgeführt werden.
Allerdings ist diese anfällig auf tippfehler oder unterstützt auch nicht mehrere Quellen.
pd.set_option('display.max_colwidth', None)
for i, (name, df) in enumerate(predictions.items()):
df = df[df.pred_context] #only get predicitons where a context was predicted
df_wrong_pred = df[~df.pred_source_matches_context.values] #get examples which were predicted wrong
correct_source = [extract_source_from_context(json.loads(context), df_wrong_pred.extractive_answer.values[i]) for i, context in enumerate(df_wrong_pred.sourced_context.values)]
predicted_source = [extract_source_from_prediction(pred) for pred in df_wrong_pred.predictions.values]
print(f"accuracy of correct context prediction fom {name} model: ", np.sum(df.pred_source_matches_context.values) / len(df.pred_source_matches_context.values))
#display(pd.DataFrame({"can_be_answered":df_wrong_pred.can_be_answered.values, "question":df_wrong_pred.question.values, "true answer":df_wrong_pred.extractive_answer.values, "prediction":df_wrong_pred.predictions.values, "true source":correct_source, "pred source":predicted_source}))
#print("\n")
accuracy of correct context prediction fom Mistral model: 0.8 accuracy of correct context prediction fom GermanLLaMA model: 0.6741573033707865 accuracy of correct context prediction fom Baseline model: 0.7441860465116279
Die Resultate zeigen, dass das GermanLLaMA mit einer Accuracy von 0.6 bezüglich Korrektheit der Quelle am schlechtesten performt.
Das Baseline Model zeigt eine mittlere Performance bei einer Accuracy von 0.64, wobei das Mistral mit einer Accuracy von 0.76 am besten performt.
Auch hier wurde nicht erwartet, dass das GermanLLaMA am schlechtesten performt, da dies im gegensatz zur Baseline auf deutschen Texten trainiert wurde, und man davon ausgehen könnte, dass es durch das bessere Sprachverständnis besser dazu in der Lage ist, die korrekte Quelle zu idenzifizieren.
Für die qualitative Analyse wurden zwei verschiedene Kontexte präpariert.
Im ersten Kontext wurden Ausschnitte aus folgenden Texten ausgewählt:
Der erste Kontext wurde so gewählt, dass die verschiedenen Texte vom Thema her unterschiedlich sind.
Im zweiten Kontext wurden Ausschnitte aus folgenden Texten ausgewählt:
Der zweite Kontext wurde so gewählt, dass die verschiedenen Texte ein ähnliches Thmea behandeln.
Die Beantwortung von Fragen auf thematisch ähnlichem Kontext könnte für das Modell schwieriger sein.
Um diese Hypothese zu testen, werden auf beiden Kontexten die selben Fragen gestellt.
Anschliessend werden die Antworten qualitativ bewertet.
| Kriterium | Beschreibung | Score-Definition (0-5) |
|---|---|---|
| Genauigkeit der Informationen | Wie viele Fakten aus der Antwort sind korrekt. | 0 = völlig ungenau, 1 = grösstenteils ungenau, 2 = teils genau teils ungenau, 3 = grösstenteils genau, 4 = sehr genau, 5 = vollständig genau |
| Vollständigkeit der Antwort | Wie viele Fakten aus dem Kontext wurden zurückgegeben. | 0 = völlig unvollständig, 1 = grösstenteils unvollständig, 2 = mehr unvollständig als vollständig, 3 = mehr vollständig als unvollständig, 4 = fast vollständig, 5 = vollständig |
| Verständlichkeit | Bewertet, wie klar und verständlich die Antwort formuliert ist. | 0 = unverständlich, 1 = schwer zu verstehen, 2 = etwas klar, 3 = überwiegend klar, 4 = sehr klar, 5 = vollkommen klar |
with open("./test_context.json") as f:
test_context = json.load(f)
context_1, context_2 = test_context
questions = [
"Welche Rolle spielen die Studierenden im Konzept des Studiengangs?",
"In welchen Bereichen ist die Lineare Algebra wichtig?",
"Welchen Zweck hat Storytelling mit Daten?",
"In wie vielen Semestern muss ich das Modul 'Grundlagen der Linearen Algebra' abschliessen?",
"Welchen Nutzen kann ich aus dem Modul 'Anwendungen der Linearen Algebra' ziehen?",
"Wie ist das Analysis Modul aufgebaut?"
]
class Predictor:
def __init__(self, commit_hash:str, hf_token:str) -> None:
with warnings.catch_warnings():
warnings.simplefilter("ignore")
peft_config = PeftConfig.from_pretrained("nlpchallenges/chatbot-qa-path", revision=commit_hash, token=hf_token)
model_config = AutoConfig.from_pretrained("nlpchallenges/chatbot-qa-path", revision=commit_hash, token=hf_token)
# Load fine-tuned LLAMA model and tokenizer
bnb_config = BitsAndBytesConfig(
load_in_4bit=True,
bnb_4bit_use_double_quant=True,
bnb_4bit_quant_type="nf4",
bnb_4bit_compute_dtype=torch.bfloat16
)
self.model = AutoModelForCausalLM.from_pretrained(
peft_config.base_model_name_or_path,
quantization_config=bnb_config,
device_map="auto",
config=model_config,
token=hf_token
)
self.model = PeftModel.from_pretrained(self.model, "nlpchallenges/chatbot-qa-path", revision=commit_hash, token=hf_token)
self.model.eval()
self.tokenizer = AutoTokenizer.from_pretrained("nlpchallenges/chatbot-qa-path", revision=commit_hash, token=hf_token)
def predict(self, context:dict, question:str):
prompt = f"[INST] Du bist ein Chatbot und versuchst die FRAGE aufgrund des KONTEXTes zu beantworten [/INST]\n\n [FRAGE] {question} [/FRAGE]\n\n [KONTEXT] {str(context)} [/KONTEXT]\n\n ANTWORT:\n"
with warnings.catch_warnings():
warnings.simplefilter("ignore")
inputs = self.tokenizer(
prompt,
return_tensors="pt",
truncation=True,
padding=False,
max_length=4096-500
).to(self.model.device)
outputs = self.model.generate(
**inputs,
max_new_tokens=500,
do_sample=False
)
return self.tokenizer.decode(outputs[:, inputs["input_ids"].shape[1]:][0], skip_special_tokens=True)
def __call__(self, *args, **kwargs):
return self.predict(*args, **kwargs)
def __del__(self):
del self.tokenizer
del self.model
torch.cuda.empty_cache()
gc.collect()
def get_predictor(model_name:str):
load_dotenv()
hf_token = os.environ["HF_ACCESS_TOKEN"]
match model_name:
case "mistral":
predictor = Predictor("da965afa6ead060901bdbe3e2ab5f5be8954c4a1", hf_token)
case "germanllama":
predictor = Predictor("0388f92924c47ddc2e0aa987551df79bc610c13d", hf_token)
case "baseline":
predictor = Predictor("b01a5d6f5611afe2b86f89a4a1fab0dc53d13ffd", hf_token)
return predictor
Der Context 1, der zur Beantwortung der Fragen zur Verüfung stand, besteht aus folgenden Texten:
Handbuch Studierende:
Die Anforderungen für die Zulassung zum Studienabschluss sind im Studienreglement ersicht- lich. 7 Infrastruktur: Nutzung und Pflege Dem Lehrbetrieb des Studiengangs Data Science steht eine räumliche und digitale Infrastruktur zur Verfügung. Für weitere Details dazu vgl. das Ausbildungskonzept . 7.1 Nutzung Die digitale Infrastruktur ist als Leitfaden und U nterstützung für die Studierenden gedacht. Sie bildet den Kern des Studienbetriebes und dient als Informationsdrehscheibe sowie als digitale und physische Begegnungs - und Austauschplattform. D eren Nutzung erfolgt auf freiwilliger Ba- sis, wird jedoch dringen dst empfohlen. 7.2 Pflege Die räumliche und digitale Infrastruktur wird von der Studiengangleitung zur Verfügung gestellt. Ihr obliegt auch die Koordination und deren Pflege. Die fachlichen Inhalte werden in erster Linie von den Fachexpert :innen, Owner n von Ch allenges und Projekten sowie von den navigate! - Coaches aufbereitet. In deren Verantwortung liegt auch die fachliche und persönliche Beglei- tung der Studierenden, welche den traditionellen Klassenunterricht weitgehend ersetzt. Entspre- chende Ansprechpersonen sind definiert . 8 Zusammenarbeit Das Ausbildungskonzept des Studiengangs Data Science ist stark auf die Eigenverantwortung der Studierenden ausgerichtet. Vor diesem Hintergrund kommt der fachlichen (Fachexper t:in) und persönlichen (navigate!) Begleitung der Studierenden ein hoher Stellenwert hin zu. Eine Zu- sammenarbeit zwischen allen Beteiligten, die auf gegenseitiger Wertschätzung und Akzeptanz beruht, ist für den Studienerfolg zentral. 8.1 Haltung Siehe Kapitel 5.1. 8.2 Kultur Der Weg ist das Ziel. Fachliche und soziale Erfahrungen stehen bei diesem Studium im Vorder- grund. Schwierigkeiten und Fehler werden als Lern- und Entwicklungsfelder gesehen. Dieser manchmal nicht einfache Prozess bedingt ein hohes Mass an Offenheit und Lernbereitschaft aller Beteiligte n. Gegenseitiger Respekt und Kommunikation auf Augenhöhe ist eine wesentli- che Voraussetzung für eine gelingende Zusammenarbeit. Insbesondere von den Studierenden wird ein hohes Mass an Selbstreflexion eingefordert. Doch auch die Fachexper t:innen und navigate! -Coaches sind fachlich und menschlich gefordert, da ihre Rolle in dieser Studienform in verschiedener Hinsicht neu definiert und gelebt wird. Selbst- bewusstsein, verbunden mit gleichzeitiger Bescheidenheit, bilden eine gute Voraussetzung für den Erfolg. Und schliesslich: Auch Freude und Humor dürfen nicht fehlen!
Portrait des Grundlagen der linearen Algebra Space:
Grundlagen der linearen Algebra ist ein Basismodul. Das heisst, Du wirst die Lernergebnisse in einem Semester erarbeiten. Die Kompetenz «Grundlagen der linearen Algebra» umfasst vier Lernergebnisse. Die einzelnen LEs werden jeweils mit Übungen ergänzt. In den Übungen kommt ab Übung 3 Python vor. Nachfolgend ist aufgeführt, was Dich erwartet, wenn Du auf die einzelnen Lernergebnisse hinarbeitest. Wo immer es um grössere Ansammlungen von Zahlen geht, kann die lineare Algebra Lösungsansätze bieten. Lineare Algebra wird verwendet in Regressionsproblemen, im Deep Learning, in Recommender Systemen, in Suchmaschinen (Page Rank), im Unsupervised Learning (PCA, SVD, NMF…), etc. Du eignest Dir hier die Grundlagenkompetenzen der linearen Algebra an und baust ein fundiertes Verständnis für ihre Werkzeuge (Matrizen und Vektoren) und ihre Anwendungen (Gleichungssysteme, Vektorgeometrie, lineare Abbildungen) auf. Du bist dabei in der Lage, alle notwendigen Berechnungen mit Modulen von Python durchzuführen.
Portrait des Storytelling with Data Space:
Daten alleine können eine trockene, leblose und unverständliche Materie sein. Um sie einem bestimmten Zielpublikum näherzubringen, müssen sie in passender Form aufbereitet, auf schlüssige Art strukturiert und auf ansprechende Weise vermittelt werden. Die Techniken dafür werden «Storytelling mit Daten» genannt. Dabei steht das Ansinnen im Vordergrund, eingängige, überzeugende und publikumsgerechte Kommunikationsformen für Daten zu entwickeln. Ein Datensatz und dessen Bestandteile sollen in eine Geschichte gepackt, mit einer Botschaft versehen und zum Leben erweckt werden. Denn: Ob man inhaltliche Aussagen und analytische Ergebnisse versteht, hängt entscheidend davon ab, wie sie kommuniziert werden. Schreibe eine eigene Datenstory. Die Story sollte ein bis mehrere Charts enthalten und eine bewusst gewählte Form aufweisen, zum Beispiel wie in Kapitel 3 des Booklet beschrieben. Du kannst das Thema frei wählen, ein Andocken der Story an Challenge- oder Projektmodule im Rahmen einer Immersiv-Aufgabe ist möglich. Besprich deine Idee auf jeden Fall mit dem Fachexperten bevor du beginnst! Und füge der Abgabe einen kurzen Begleittext hinzu, in dem Du deine Überlegungen hinter der Wahl der Storyform und des Aufbaus dokumentierst.
model_type = "baseline"
predictor = get_predictor(model_type)
print('\033[93m' + f"{model_type} Model:" + '\033[0m')
for i, question in enumerate(questions):
print('\033[92m' + f"Question: {i+1}\n " + question + '\033[0m')
print('\033[94m' + "Answer: \n " + '\n'.join(textwrap.wrap(predictor.predict(context_1, question), width=100)) + '\033[0m')
del predictor
Downloading shards: 100%|██████████| 3/3 [00:00<00:00, 5.09it/s] Loading checkpoint shards: 100%|██████████| 3/3 [00:07<00:00, 2.58s/it] Special tokens have been added in the vocabulary, make sure the associated word embeddings are fine-tuned or trained.
baseline Model: Question: 1 Welche Rolle spielen die Studierenden im Konzept des Studiengangs? Answer: Die Studierenden spielen im Konzept des Studiengangs eine wichtige Rolle. Sie sind für die fachliche und soziale Begleitung der Studierenden verantwortlich und werden dazu aufgefordert, ein hohes Maß an Offenheit und Lernbereitschaft zu zeigen. (Quelle: Handbuch Studierende) Question: 2 In welchen Bereichen ist die Lineare Algebra wichtig? Answer: Die Lineare Algebra ist wichtig in verschiedenen Bereichen, wie z.B. Regressionsproblemen, im Deep Learning, in Recommender Systemen, in Suchmaschinen und im Unsupervised Learning. (Quelle: Portrait des Grundlagen der linearen Algebra Space) Question: 3 Welchen Zweck hat Storytelling mit Daten? Answer: Storytelling mit Daten dient dem Zweck, Daten in eine Geschichte zu packen, mit einer Botschaft zu versehen und zum Leben zu erwecken. (Quelle: Portrait des Storytelling with Data Spaces) Question: 4 In wie vielen Semestern muss ich das Modul 'Grundlagen der Linearen Algebra' abschliessen? Answer: Du musst das Modul 'Grundlagen der Linearen Algebra' in einem Semester abschliessen. (Quelle: Portrait des Grundlagen der linearen Algebra Space) Question: 5 Welchen Nutzen kann ich aus dem Modul 'Anwendungen der Linearen Algebra' ziehen? Answer: Du kannst aus dem Modul "Anwendungen der Linearen Algebra" verschiedene Nutzen ziehen. Es kann dir helfen, Regressionsproblemen, Deep Learning, Recommender Systemen, Suchmaschinen und Unsupervised Learning zu verstehen und zu nutzen. Außerdem kannst du verschiedene Werkzeuge und Anwendungen der linearen Algebra erlernen. (Quelle: Portrait des Grundlagen der linearen Algebra Space) Question: 6 Wie ist das Analysis Modul aufgebaut? Answer: Das Analysis Modul ist aufgebaut, um dir die Fähigkeit zu geben, alle notwendigen Berechnungen mit Modulen von Python durchzuführen. (Quelle: Portrait des Grundlagen der linearen Algebra Space)
| Kriterium | Bewertung | Begründung |
|---|---|---|
| Genauigkeit | 2.5 | Die zwei nicht beantwortbaren Fragen (5 & 6) wurden beide aus dem falschen Kontext beantwortet. Die beiden extractive Fragen (2 & 4) konnten korrekt beantwortet werden. Die Antwort auf Frage 1 ist nur teilweise richtig, da nicht die Studierenden für die Studierenden verantwortlich sind. |
| Vollständigkeit | 2 | Die Antwort ist grösstenteils nicht vollständig. Lediglich Frage (2 & 4) wurden vollständig beantwortet. |
| Verständkichkeit | 3 | Meist sind die Antworten verständlich, allerdings ist der Satzbau nicht wirklich menschlich und die Frage 6 wurde nicht korrekt formuliert: 'Das Analysis Modul ist aufgebaut, ...'. |
Durchschnittlicher Score: 2.5
model_type = "germanllama"
predictor = get_predictor(model_type)
print('\033[93m' + f"{model_type} Model:" + '\033[0m')
for i, question in enumerate(questions):
print('\033[92m' + f"Question: {i+1}\n " + question + '\033[0m')
print('\033[94m' + "Answer: \n " + '\n'.join(textwrap.wrap(predictor.predict(context_1, question), width=100)) + '\033[0m')
del predictor
Downloading shards: 100%|██████████| 3/3 [00:00<00:00, 6.85it/s] Loading checkpoint shards: 100%|██████████| 3/3 [00:07<00:00, 2.57s/it] Special tokens have been added in the vocabulary, make sure the associated word embeddings are fine-tuned or trained.
germanllama Model: Question: 1 Welche Rolle spielen die Studierenden im Konzept des Studiengangs? Answer: Die Studierenden spielen eine wichtige Rolle im Konzept des Studiengangs. Sie sind die zentrale Gruppe, die die räumliche und digitale Infrastruktur des Studiengangs nutzt und pflegt. Die Studierenden sind auch die Zielgruppe für die fachliche und persönliche Begleitung, die von den Fachexpert:innen, den Challenges und den Projekten sowie den navigate!-Coaches bereitgestellt wird. Die Zusammenarbeit zwischen allen Beteiligten ist für den Studienerfolg von entscheidender Bedeutung. Die Studierenden werden ermutigt, ein hohes Maß an Offenheit und Lernbereitschaft zu haben und sich selbst zu reflektieren. Die Fachexpert:innen und navigate!-Coaches sind ebenfalls fachlich und menschlich gefordert, um eine erfolgreiche Zusammenarbeit zu gewährleisten. (Quelle: Handbuch Studierende) Question: 2 In welchen Bereichen ist die Lineare Algebra wichtig? Answer: Die Lineare Algebra ist in verschiedenen Bereichen wichtig, wie z.B. in Regressionsproblemen, im Deep Learning, in Recommender Systemen, in Suchmaschinen (Page Rank), im Unsupervised Learning (PCA, SVD, NMF) und vielen anderen. (Quelle: Handbuch Studierende) Question: 3 Welchen Zweck hat Storytelling mit Daten? Answer: Storytelling mit Daten hat den Zweck, Daten in eine Geschichte zu packen, um sie einem bestimmten Zielpublikum näherzubringen. Dabei werden Techniken eingesetzt, um eingängige, überzeugende und publikumsgerechte Kommunikationsformen für Daten zu entwickeln. Die Story sollte ein bis mehrere Charts enthalten und eine bewusst gewählte Form aufweisen. (Quelle: Portrait des Storytelling with Data Space) Question: 4 In wie vielen Semestern muss ich das Modul 'Grundlagen der Linearen Algebra' abschliessen? Answer: Du musst das Modul 'Grundlagen der Linearen Algebra' in einem Semester abschließen. (Quelle: Handbuch Studierende) Question: 5 Welchen Nutzen kann ich aus dem Modul 'Anwendungen der Linearen Algebra' ziehen? Answer: Das Modul 'Anwendungen der Linearen Algebra' kann Ihnen helfen, grössere Ansammlungen von Zahlen zu analysieren und Lösungsansätze für Regressionsprobleme, Deep Learning, Recommender Systeme, Suchmaschinen, Unsupervised Learning und andere Anwendungen zu finden. Es kann Ihnen auch ein fundiertes Verständnis für die Werkzeuge der linearen Algebra wie Matrizen und Vektoren sowie ihre Anwendungen wie Gleichungssysteme, Vektorgeometrie und lineare Abbildungen vermitteln. (Quelle: Handbuch Studierende) Question: 6 Wie ist das Analysis Modul aufgebaut? Answer: Leider liegen mir keine Informationen darüber vor, wie das Analysis Modul aufgebaut ist.
| Kriterium | Bewertung | Begründung |
|---|---|---|
| Genauigkeit | 3.5 | Die meisten Fakten in den Antworten stimmen (1, 2, 3, 4, 6), allerdings wurde öfters die falsche Quelle angegeben (2, 4). |
| Vollständigkeit | 4 | Die Fragen wurden meist vollständig beantwortet (1, 2, 3, 4, 6). |
| Verständkichkeit | 4.5 | Die deutsche Grammatik wurde gekonnt verwendet. Teilweise sind die Sätze aber etwas kompliziert. |
Durchschnittlicher Score: 4
Das GermanLLaMA Model ist qualitativ besser in der Beantwortung der Fragen als die Baseline aufgrund der Verwendung natürlicherer Sprache und präziserer Beantwortung.
Allerdings hat dieses Modell mehrmals die falsche Quelle angegeben, obwohl die verwendeten Informationen eigentlich aus dem korrekten Block stammt.
model_type = "mistral"
predictor = get_predictor(model_type)
print('\033[93m' + f"{model_type} Model:" + '\033[0m')
for i, question in enumerate(questions):
print('\033[92m' + f"Question: {i+1}\n " + question + '\033[0m')
print('\033[94m' + "Answer: \n " + '\n'.join(textwrap.wrap(predictor.predict(context_1, question), width=100)) + '\033[0m')
del predictor
Downloading shards: 100%|██████████| 2/2 [00:00<00:00, 7.73it/s] Loading checkpoint shards: 100%|██████████| 2/2 [00:05<00:00, 2.63s/it] Special tokens have been added in the vocabulary, make sure the associated word embeddings are fine-tuned or trained. Setting `pad_token_id` to `eos_token_id`:2 for open-end generation.
mistral Model: Question: 1 Welche Rolle spielen die Studierenden im Konzept des Studiengangs?
Setting `pad_token_id` to `eos_token_id`:2 for open-end generation.
Answer: Die Studierenden spielen eine wichtige Rolle im Konzept des Studiengangs Data Science. Sie sind die Hauptträger der Eigenverantwortung und werden von den Fachexperten und navigate! -Coaches in ihrer fachlichen und persönlichen Begleitung unterstützt. Die Studierenden sind auch für die Nutzung und Pflege der digitalen Infrastruktur verantwortlich. Sie nutzen die digitale Infrastruktur als Leitfaden und Unterstützung für den Studienbetrieb. Die fachlichen Inhalte werden von den Fachexperten aufbereitet und die Studierenden werden von den Fachexperten und navigate! -Coaches begleitet. Eine gegenseitige Zusammenarbeit zwischen allen Beteiligten ist für den Studienerfolg wichtig. (Quelle: Handbuch Studierende) Question: 2 In welchen Bereichen ist die Lineare Algebra wichtig?
Setting `pad_token_id` to `eos_token_id`:2 for open-end generation.
Answer: Die Lineare Algebra ist in verschiedenen Bereichen wichtig. Sie wird in Regressionsproblemen, im Deep Learning, in Recommender Systemen, in Suchmaschinen (Page Rank), im Unsupervised Learning (PCA, SVD, NMF...) und anderen Anwendungen eingesetzt. (Quelle: Portrait des Grundlagen der linearen Algebra Space) Question: 3 Welchen Zweck hat Storytelling mit Daten?
Setting `pad_token_id` to `eos_token_id`:2 for open-end generation.
Answer: Storytelling mit Daten hat den Zweck, Daten in eine ansprechende und verständliche Form zu bringen, um sie einem bestimmten Zielpublikum näherzubringen. Es geht darum, Daten in eine Geschichte zu packen, mit einer Botschaft zu versehen und zum Leben zu erwecken. Dies ermöglicht es, dass die Daten verständlich und überzeugend kommuniziert werden können. (Quelle: Portrait des Storytelling with Data Space) Question: 4 In wie vielen Semestern muss ich das Modul 'Grundlagen der Linearen Algebra' abschliessen?
Setting `pad_token_id` to `eos_token_id`:2 for open-end generation.
Answer: Du musst das Modul 'Grundlagen der Linearen Algebra' in einem Semester abschließen. (Quelle: Portrait des Grundlagen der linearen Algebra Space) Question: 5 Welchen Nutzen kann ich aus dem Modul 'Anwendungen der Linearen Algebra' ziehen?
Setting `pad_token_id` to `eos_token_id`:2 for open-end generation.
Answer: Das Modul "Anwendungen der Linearen Algebra" bietet dir die Möglichkeit, die Grundlagen der linearen Algebra zu erlernen und ein fundiertes Verständnis für ihre Werkzeuge und Anwendungen zu entwickeln. Es ist ein Basismodul, das in einem Semester abgeschlossen werden kann. Du wirst die Lernergebnisse in vier Lernergebnissen erarbeiten, die jeweils mit Übungen ergänzt werden. Ab Übung 3 wird Python verwendet. Durch das Modul kannst du grössere Ansammlungen von Zahlen lösen und es wird auf verschiedene Anwendungen der linearen Algebra eingegangen, wie Regressionsprobleme, Deep Learning, Recommender Systeme, Suchmaschinen (Page Rank) und Unsupervised Learning (PCA, SVD, NMF...). Du wirst die Grundlagenkompetenzen der linearen Algebra erlernen und ein fundiertes Verständnis für ihre Werkzeuge und Anwendungen aufbauen. (Quelle: Portrait des Grundlagen der linearen Algebra Space) Question: 6 Wie ist das Analysis Modul aufgebaut? Answer: Das Analysis Modul ist ein Basismodul, das in einem Semester abgeschlossen wird. Es umfasst vier Lernergebnisse, die jeweils mit Übungen ergänzt werden. Ab Übung 3 kommt Python vor. Das Modul bietet eine fundierte Grundlagenkompetenz in der linearen Algebra und beinhaltet das Verständnis von Matrizen, Vektoren und deren Anwendungen in verschiedenen Bereichen wie Regressionsproblemen, Deep Learning, Recommender Systemen, Suchmaschinen und Unsupervised Learning. (Quelle: Portrait des Grundlagen der linearen Algebra Space)
| Kriterium | Bewertung | Begründung |
|---|---|---|
| Genauigkeit | 3.5 | Die meissten Fakten sowie Quellen in den Antworten stimmen (1, 2, 3, 4). |
| Vollständigkeit | 3.5 | Die Fragen wurden meisst vollständig beantwortet (1, 2, 3, 4). |
| Verständkichkeit | 3.5 | Die deutsche Grammatik wurde gekonnt verwendet. Allerdings sind die Sätze oft sehr kompliziert geschrieben. |
Das Mistral Model befindet ich auf einem ähnlichen Niveau wie das GermanLLaMA Modell. Das Modell gibt die Context Blöcke, aus welchen es die Informationen hat, immer korrekt an.
Allerdings was das LLaMA Model besser in der Erkennung der nicht beantwortbaren Fragen.
Durchschnittlicher Score: 3.5
Portrait des Grundlagen der linearen Algebra Space:
Grundlagen der linearen Algebra ist ein Basismodul. Das heisst, Du wirst die Lernergebnisse in einem Semester erarbeiten. Die Kompetenz «Grundlagen der linearen Algebra» umfasst vier Lernergebnisse. Die einzelnen LEs werden jeweils mit Übungen ergänzt. In den Übungen kommt ab Übung 3 Python vor. Nachfolgend ist aufgeführt, was Dich erwartet, wenn Du auf die einzelnen Lernergebnisse hinarbeitest. Wo immer es um grössere Ansammlungen von Zahlen geht, kann die lineare Algebra Lösungsansätze bieten. Lineare Algebra wird verwendet in Regressionsproblemen, im Deep Learning, in Recommender Systemen, in Suchmaschinen (Page Rank), im Unsupervised Learning (PCA, SVD, NMF…), etc. Du eignest Dir hier die Grundlagenkompetenzen der linearen Algebra an und baust ein fundiertes Verständnis für ihre Werkzeuge (Matrizen und Vektoren) und ihre Anwendungen (Gleichungssysteme, Vektorgeometrie, lineare Abbildungen) auf. Du bist dabei in der Lage, alle notwendigen Berechnungen mit Modulen von Python durchzuführen.
Portrait des Anwendungen der linearen Algebra Space:
Anwendungen der linearen Algebra ist eine Basiskompetenz. Zur selbstständigen Erarbeitung der Lernergebnisse erhältst du von uns noch verschiedene Instrumente: Zeitplan Prüfungsstruktur Skript Übungsserien Die Kompetenz «Anwendungen der linearen Algebra» umfasst fünf Lernergebnisse. Nachfolgend ist aufgeführt, was dich erwartet, wenn du auf die einzelnen Lernergebnisse hinarbeitest. Nun bist du in der Lage, mit Deinem Wissen die Herleitung einer beispielhaften Auswahl von lineare Algebra–lastigen Methoden des Machine Learning zu durchdringen und diese selbst zu implementieren, konkret für Lineare Regression (Herleitung der Normalengleichung in Matrizenform auf verschiedene Arten, Anwendung auf einfache Datensätze), Page Rank (Repräsentation von Graphen mit Matrizen, Berechnung von Zentralitätsmassen mit Mitteln der linearen Algebra), Recommender Systeme (Empfehlen von ähnlichen Objekten mittels Collaborative Filtering) und Singulärwertzerlegung (Zerlegung von Matrizen, geometrisches Verständnis, Anwendung als Datenkomprimierung). Zu allen Verfahren gibt es eine Mini-Challenge, die du lösen und mit uns besprechen kannst. Grosse Teile der Lerneinheiten 1-4 kommen hier zur Anwendung und sollten jeweils bereits gut sitzen, wenn du mit der Bearbeitung der Mini-Challenge beginnst.
Portrait des Vertiefende Themen der Analysis Space:
Vertiefende Themen der Analysis ist eine Basiskompetenz. Das heisst, Du wirst die Lernergebnisse durch verschiedene, selbst zusammengestellte Aufgaben über mehrere Semester hinweg bearbeiten. Die Kompetenz «Vertiefende Themen der Analysis» umfasst fünf Lernergebnisse (LE). Nachfolgend ist aufgeführt, was Dich erwartet, wenn Du auf die einzelnen Lernergebnisse hinarbeitest. Der gesamte Inhalt der Vorlesung ist im Skript (oben rechts) zusammengefasst, welches auch als Leitfaden für die Bearbeitung der Aufgaben dient. Dieses Skript ist noch nicht fertig gestellt und wird über das Semester laufend aktualisiert, sodass stets der Lernstoff für die Woche enthalten ist.
model_type = "baseline"
predictor = get_predictor(model_type)
print('\033[93m' + f"{model_type} Model:" + '\033[0m')
for i, question in enumerate(questions):
print('\033[92m' + f"Question: {i+1}\n " + question + '\033[0m')
print('\033[94m' + "Answer: \n " + '\n'.join(textwrap.wrap(predictor.predict(context_2, question), width=100)) + '\033[0m')
del predictor
Downloading shards: 100%|██████████| 3/3 [00:00<00:00, 7.91it/s] Loading checkpoint shards: 100%|██████████| 3/3 [00:07<00:00, 2.60s/it] Special tokens have been added in the vocabulary, make sure the associated word embeddings are fine-tuned or trained.
baseline Model: Question: 1 Welche Rolle spielen die Studierenden im Konzept des Studiengangs? Answer: Die Studierenden spielen eine wichtige Rolle im Konzept des Studiengangs. Sie sind diejenigen, die den Studiengang durchlaufen und die Lernergebnisse erarbeiten. Die Studierenden haben die Verantwortung, die Lernergebnisse zu erarbeiten und zu beantworten. Sie müssen sich auch um die Prüfungen kümmern und sich auf die Prüfungen vorbereiten. Question: 2 In welchen Bereichen ist die Lineare Algebra wichtig? Answer: Die Lineare Algebra ist wichtig in verschiedenen Bereichen, darunter Regressionsproblemen, im Deep Learning, in Recommender Systemen, in Suchmaschinen (Page Rank) und im Unsupervised Learning (PCA, SVD, NMF). (Quelle: Portrait des Grundlagen der linearen Algebra Space) Question: 3 Welchen Zweck hat Storytelling mit Daten? Answer: Leider liegen mir keine Informationen darüber vor, welchen Zweck Storytelling mit Daten hat. Question: 4 In wie vielen Semestern muss ich das Modul 'Grundlagen der Linearen Algebra' abschliessen? Answer: Du musst das Modul 'Grundlagen der Linearen Algebra' in einem Semester abschliessen. (Quelle: Portrait des Grundlagen der linearen Algebra Space) Question: 5 Welchen Nutzen kann ich aus dem Modul 'Anwendungen der Linearen Algebra' ziehen? Answer: Du kannst aus dem Modul "Anwendungen der linearen Algebra" verschiedene Nutzen ziehen. Es bietet Lösungsansätze für Regressionsproblemen, Deep Learning, Recommender Systemen, Suchmaschinen und Unsupervised Learning. Außerdem kannst du mit Deinem Wissen die Herleitung von lineare Algebra- lastigen Methoden des Machine Learning durchdringen und selbst implementieren. (Quelle: Portrait des Anwendungen der linearen Algebra Space) Question: 6 Wie ist das Analysis Modul aufgebaut? Answer: Das Analysis Modul ist aufgebaut aus verschiedenen Lernergebnissen, die Du über mehrere Semester hinweg bearbeiten wirst. (Quelle: Portrait des Grundlagen der linearen Algebra Space)
| Kriterium | Bewertung | Begründung |
|---|---|---|
| Genauigkeit | 3.5 | Bei 1 wurde nicht erkannt, dass die Frage nicht beantwortet werden kann. Fakten der Antworten (2-6) soweit alle korrekt. |
| Vollständigkeit | 3.5 | Die meisten Aspekte der Fragen wurden grösstenteils abgedeckt. |
| Verständkichkeit | 3.5 | Die Antworten sind verständlich, allerdings ist der Satzbau teilweise nicht wirklich menschlich. |
Generell fallen die Antworten eher kurz aus.
Frage 1 wurde zwar nicht als nicht beantwortbar erkannt, allerdings ist positiv dass keine Quelle angegeben wurde, was für User als Idikator dienen könnte, dass hier pretrained Knowledge verwendet wurde.
Durchschnittlicher Score: 3.5
model_type = "germanllama"
predictor = get_predictor(model_type)
print('\033[93m' + f"{model_type} Model:" + '\033[0m')
for i, question in enumerate(questions):
print('\033[92m' + f"Question: {i+1}\n " + question + '\033[0m')
print('\033[94m' + "Answer: \n " + '\n'.join(textwrap.wrap(predictor.predict(context_2, question), width=100)) + '\033[0m')
del predictor
Downloading shards: 100%|██████████| 3/3 [00:00<00:00, 7.55it/s] Loading checkpoint shards: 100%|██████████| 3/3 [00:07<00:00, 2.57s/it] Special tokens have been added in the vocabulary, make sure the associated word embeddings are fine-tuned or trained.
germanllama Model: Question: 1 Welche Rolle spielen die Studierenden im Konzept des Studiengangs? Answer: Die Studierenden spielen keine Rolle im Konzept des Studiengangs. Question: 2 In welchen Bereichen ist die Lineare Algebra wichtig? Answer: Die Lineare Algebra ist in verschiedenen Bereichen wichtig, darunter Regressionsprobleme, Deep Learning, Recommender Systeme, Suchmaschinen (Page Rank), Unsupervised Learning (PCA, SVD, NMF), etc. (Quelle: Portrait des Grundlagen der linearen Algebra Space). Question: 3 Welchen Zweck hat Storytelling mit Daten? Answer: Storytelling mit Daten kann dazu beitragen, komplexe Informationen und Trends in einer ansprechenden und verständlichen Weise zu präsentieren. Es kann auch dazu beitragen, Entscheidungen zu treffen und Probleme zu lösen, indem es Daten in eine Geschichte integriert, die leicht verständlich und ansprechend ist. Question: 4 In wie vielen Semestern muss ich das Modul 'Grundlagen der Linearen Algebra' abschliessen? Answer: Du musst das Modul 'Grundlagen der Linearen Algebra' in einem Semester abschließen. (Quelle: Portrait des Grundlagen der linearen Algebra Space) Question: 5 Welchen Nutzen kann ich aus dem Modul 'Anwendungen der Linearen Algebra' ziehen? Answer: Das Modul 'Anwendungen der linearen Algebra' bietet dir die Möglichkeit, lineare Algebra-lastige Methoden des Machine Learning zu erlernen und zu implementieren. Dazu gehören lineare Regression, Page Rank, Recommender Systeme und Singulärwertzerlegung. Diese Methoden können in verschiedenen Anwendungsbereichen wie Regressionsproblemen, Deep Learning, Recommender Systemen und Suchmaschinen eingesetzt werden. (Quelle: Portrait des Anwendungen der linearen Algebra Space) Question: 6 Wie ist das Analysis Modul aufgebaut? Answer: Das Analysis Modul ist aufgebaut wie folgt: Es umfasst fünf Lernergebnisse, die jeweils mit Übungen ergänzt werden. Die Lernergebnisse sind in der Portrait der Analysis Space beschrieben. (Quelle: Portrait der Analysis Space)
| Kriterium | Bewertung | Begründung |
|---|---|---|
| Genauigkeit | 3 | Halluziniert bei zwei Fragen (1, 3). Ansonnsten sind die Antworten korrekt. |
| Vollständigkeit | 3.5 | Die meissten Aspekte der Fragen wurden grösstenteils Abgedeckt. |
| Verständkichkeit | 3.5 | Die Antworten sind soweit verständlich. Allerdings ist teilweise der Satzbau nicht korrekt: 'Das Analysis Modul ist aufgebaut wie folgt: ...'. Bei Frage 5 gibt es Wiederholungen in der Antwort. |
Durchschnittlicher Score: 3.33
Das GermanLLaMA hat in diesem Beispiel schlechter performt als das Baseline Mode.
Das GermanLLaMA hat einmal mehr haluziniert als die Baseline und hat somit weniger gut Fragen erkennen können, welche aus dem Kontext nicht beantwortbar sind.
Das GermanLLaMA zeigt bei der Frage 5 Wiederholungen auf.
model_type = "mistral"
predictor = get_predictor(model_type)
print('\033[93m' + f"{model_type} Model:" + '\033[0m')
for i, question in enumerate(questions):
print('\033[92m' + f"Question: {i+1}\n " + question + '\033[0m')
print('\033[94m' + "Answer: \n " + '\n'.join(textwrap.wrap(predictor.predict(context_2, question), width=100)) + '\033[0m')
del predictor
Downloading shards: 100%|██████████| 2/2 [00:00<00:00, 5.15it/s] Loading checkpoint shards: 100%|██████████| 2/2 [00:05<00:00, 2.67s/it] Special tokens have been added in the vocabulary, make sure the associated word embeddings are fine-tuned or trained. Setting `pad_token_id` to `eos_token_id`:2 for open-end generation.
mistral Model: Question: 1 Welche Rolle spielen die Studierenden im Konzept des Studiengangs?
Setting `pad_token_id` to `eos_token_id`:2 for open-end generation.
Answer: Die Rolle der Studierenden im Konzept des Studiengangs ist es, die Lernergebnisse zu erarbeiten und ihre Kompetenzen zu erweitern. Sie erhalten verschiedene Instrumente wie Zeitplan, Prüfungsstruktur, Skript und Übungsserien, um die Lernergebnisse selbstständig zu bearbeiten. Die Kompetenz "Anwendungen der linearen Algebra" umfasst fünf Lernergebnisse, bei denen die Studierenden verschiedene Methoden des Machine Learning durchdringen und selbst implementieren können. Es gibt auch Mini-Challenges, die die Studierenden lösen und mit den Dozenten besprechen können. Die Lernergebnisse werden durch verschiedene Aufgaben über mehrere Semester hinweg bearbeitet, um die Kompetenzen zu erweitern. (Quelle: Portrait des Grundlagen der linearen Algebra Space, Portrait des Anwendungen der linearen Algebra Space, Portrait des Vertiefende Themen der Analysis Space) Question: 2 In welchen Bereichen ist die Lineare Algebra wichtig?
Setting `pad_token_id` to `eos_token_id`:2 for open-end generation.
Answer: Die Lineare Algebra ist in verschiedenen Bereichen wichtig. Sie wird in Regressionsproblemen, im Deep Learning, in Recommender Systemen, in Suchmaschinen (Page Rank), im Unsupervised Learning (PCA, SVD, NMF...) und anderen Anwendungen eingesetzt. (Quelle: Portrait des Grundlagen der linearen Algebra Space) Question: 3 Welchen Zweck hat Storytelling mit Daten?
Setting `pad_token_id` to `eos_token_id`:2 for open-end generation.
Answer: Storytelling mit Daten hat den Zweck, komplexe Daten und Informationen in einer verständlichen und interessanten Weise darzustellen. Es ermöglicht es, Daten zu visualisieren, zu interpretieren und zu verstehen. Storytelling kann auch dazu beitragen, die Bedeutung von Daten zu verdeutlichen und die Zusammenhänge zwischen verschiedenen Datenpunkten zu erklären. Es ist eine Möglichkeit, Daten zu präsentieren und zu kommunizieren, um sie für andere verständlich zu machen. Question: 4 In wie vielen Semestern muss ich das Modul 'Grundlagen der Linearen Algebra' abschliessen?
Setting `pad_token_id` to `eos_token_id`:2 for open-end generation.
Answer: Das Modul 'Grundlagen der Linearen Algebra' muss in einem Semester abgeschlossen werden. (Quelle: Portrait des Grundlagen der linearen Algebra Space) Question: 5 Welchen Nutzen kann ich aus dem Modul 'Anwendungen der Linearen Algebra' ziehen?
Setting `pad_token_id` to `eos_token_id`:2 for open-end generation.
Answer: Durch das Modul "Anwendungen der Linearen Algebra" kannst du verschiedene Anwendungen der Linearen Algebra erlernen und anwenden. Dies kann dir helfen, grössere Ansammlungen von Zahlen zu verarbeiten und Lösungsansätze für verschiedene Probleme zu finden. Die Lineare Algebra wird in Regressionsproblemen, Deep Learning, Recommender Systemen, Suchmaschinen (Page Rank), Unsupervised Learning (PCA, SVD, NMF...) und anderen Anwendungen eingesetzt. Du wirst die Grundlagenkompetenzen der Linearen Algebra erlernen und ein fundiertes Verständnis für ihre Werkzeuge (Matrizen und Vektoren) und Anwendungen (Gleichungssysteme, Vektorgeometrie, lineare Abbildungen) aufbauen. Du wirst auch in der Lage sein, alle notwendigen Berechnungen mit Modulen von Python durchzuführen. (Quelle: Portrait des Anwendungen der linearen Algebra Space) Question: 6 Wie ist das Analysis Modul aufgebaut? Answer: Das Analysis Modul ist aufgebaut, indem die Lernergebnisse durch verschiedene, selbst zusammengestellte Aufgaben über mehrere Semester hinweg bearbeitet werden. Es gibt fünf Lernergebnisse, die jeweils mit Übungen ergänzt werden. Ab Übung 3 kommt Python vor. Die Kompetenz "Vertiefende Themen der Analysis" umfasst fünf Lernergebnisse. (Quelle: Portrait des Vertiefenden Themen der Analysis Space)
| Kriterium | Bewertung | Begründung |
|---|---|---|
| Genauigkeit | 3.5 | Haluziniert bei zwei Fragen (1, 3). Ansonnsten sind die Antworten korrekt. |
| Vollständigkeit | 3.5 | Die meisten Aspekte der Fragen wurden grösstenteils abgedeckt. |
| Verständkichkeit | 4 | Die Antworten sind verständlich. Soweit solider Satzbau. Wiederholungen in Antwort der Frage 6. |
Durchschnittlicher Score: 3.67
Das Mistral Model zeigt ähnliche Performance wie das GermanLLaMA.
Allerdings ist auffällig, dass das Mistral hier Anzeichen für die Verwendung von mehreren Blöcken im Kontext zeigt, was auch wünschenswert wäre.
Dies ist bei Frage 1 sowie Frage 5 zu erkennen. Beim GermanLLaMA war dieses Verhalten nicht erkennbar.
Die Metriken auf dem Test Dataset (siehe W&B Report für alle Deatils) sehen wie folgt aus:
| Modell | BLEU-4 | ROUGE-L |
|---|---|---|
| Baseline | 0.36 | 0.57 |
| GermanLLaMA | 0.40 | 0.61 |
| Mistral | 0.43 | 0.62 |
Tragen wir nun die Resultate aus der Qualitativen Analyse in einer Tabelle zusammen.
| Modell | Context 1 | Context 2 | Durchschnitt |
|---|---|---|---|
| Baseline | 2.5 | 3.5 | 3 |
| GermanLLaMA | 4 | 3.33 | 3.67 |
| Mistral | 3.5 | 3.67 | 3.59 |
Mistral und GermanLLaMA liegen Qualitativ nahe beeinander, sind jedoch eindeutig besser wie die Baseline. Quantitativ erzielt das Mistral Modell nochmals etwas bessere Resultate als das GermanLLaMA Modell, weshalb wir uns dafür entschieden haben, das Mistral Modell für den Question Answering Task in unserem Chatbot einzusetzen.
TODO: Schreiben dass Out of Scope, jedoch beschreiben was wir versucht hätten.
Wo wurden Fehler gemacht?
ROME
Attention scores
Insgesamt ist das Resultat zufriedenstellend. Es wurden erfolgreich mehrere LLMs fine-tuned, die nun in der Lage sind, Fragen aufgrund von gegebenem Kontext zu beantworten. Dabei sind die Modelle nicht perfekt, und es gibt mehrere Ideen, wie die Modelle noch verbessert werden könnten:
can_be_answered=False Samples mit die dennoch beantwortet wurden, in das fine-tuning eingeflossen sind